package com.hl.annotation.bean_init_01.service;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 使用 @Component 定义一个 Bean 对象
 * 使用 @Autowired 依赖注入该对象，相当于 new 一个对象，并填充了子对象的属性
 * spring 创建Bean实例的时候，使用哪个构造方法
 *      如果一个都没写，则使用 无参的
 *      如果写了一个，则使用那一个
 *      如果写了多个，如果没有指定，如果有无参的则使用无参的，否则报错
 *      如果写了多个，如果使用 @Autowired 指定，则用指定的
 *
 * @author liuhuan
 */
@Component // 默认BeanName 为 userService
public class UserService implements InitializingBean {

//    @Autowired // 依赖注入该对象
//  通过 构造器初始化
    private OrderService orderService;

    public void test() {
        System.out.println(orderService);
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("---- 依赖注入后执行方法 ----");
        System.out.println("orderService = " + orderService);
    }



    // ---- spring 创建Bean实例的时候，使用哪个构造方法 start
    public UserService() {
        System.out.println(1);
    }

    @Autowired       //OrderService orderService13 会报错
    public UserService(OrderService orderService12) {// 当前有三个：orderService,orderService11,orderService12，所以 不叫这三个的变量名都会报错
        // orderService 来源：去单利池里get, 如果没有找到则创建一个Bean对象，如果不能创建则报错，不会传null。OrderService 可以被创建，因为有注解修饰 @Component
        //                                 依赖查找策略：如果有多个同一类型的Bean对象，如果找：按优先级 byType -> byName
        //                                 具体的：先根据变量类型找，如果找到一个，则使用这个Bean对象
        //                                                 如果找到多个，再根据 变量名字 找，如果有匹配则返回，没有则报错
        this.orderService = orderService12;
        System.out.println(2);
    }

    public UserService(OrderService orderService, OrderService orderService1) {
        this.orderService = orderService;
        System.out.println(3);
    }
    // ---- spring 创建Bean实例的时候，使用哪个构造方法 end

}
